<html>
<head>
    <title>Пример написания модуля</title>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
</head>
<body>
<h1>Пример написания модуля WR2</h1>
<h3>Рабочий цикл WR2 и любого модуля изнутри</h3>
<p style="margin-left:20px">Участие самой WR2 в рабочем цикле не большое. Сперва она загружает необходимые
    для всей работы классы
    и выбранный пользователем модуль. Затем, получив из модуля информацию о его параметрах, WR2
    обрабатывает заданные пользователем аргументы и передаёт модулю их значения.<br />
    Далее следуюет вызов метода run() модуля и ожидание окончания его работы (в бесконечном цикле
    проверяется результат module.finished()). Как только это произошло, происходит вывод результата
    module.getResult() и завершение работы.</p>
<h3>Написание нового модуля</h3>
<p style="margin-left:20px">
    Написание нового модуля для WR2 начинается с создания файла с соответствующим классом в директории
    /modules/. Например, для модуля HostsBrute это файл /modules/HostsBrute.py с классом HostsBrute.<br />
    Класс модуля должен являться наследником WSModule. Он обязательно должен иметь два свойства - log_path
    (путь к логу, куда будет записан результат работы модуля) и набор options с описанием пользовательских опций.
    Пример последнего:<br />
<blockquote>
    {"threads": WSOption("threads", "count thread", 5, False, ['-t', '--threads']),<br/>
    "ip": WSOption("ip", "target ip", "", True, ['-i', '--ip'])}<br/>
</blockquote>
Здесь описываются 2 параметра которые может указать пользователь при запуске WR2. Первый - "threads",
с описанием "count thread", значением по умолчанию 5, без условия обязательного указания и с именами
опций командной строки "-t" и "--threads". Второй - "ip", с описанием "target ip", без значения по умолчанию
и с условием обязательного указания. Имена опций командной строки у второго параметра "-i" и "--ip".<br />
При таком обозначении возможны следующие запуски WR2 и данного модуля:
<blockquote>
    python3 wscli.py ModuleName -i 1.1.1.1<br />
    python3 wscli.py ModuleName --ip 1.1.1.1 -t 10<br />
    python3 wscli.py ModuleName -i 1.1.1.1 --threads 10<br />
</blockquote>
Затем идут методы модуля. Главный из них - run() - должен содержать основную внутреннюю логику.
Именно там должны формироваться данные для работы потоков, создаваться их объекты и т.д.<br/>
Для этого нужно описать остальные рабочие классы - очереди, потоков и результата.
У модуля HostsBrute это HostBruteJob, HostBruteThread и HostBruteResult в директории /classes. Ниже мы их обсудим. Что
касается module.run(), то заполнив очередь необходимыми данными в нём должен сформироваться список потоков
(не запущенных), который затем будет передан self.kernel.createThreads(). Ядро запустит их само.<br/>
<br />
Остаётся объявить ещё 2 метода. help() - должен возвращать строку со справкой по данному модулю, и finished() -
должен вернуть True если работа модуля закончена. В случае, когда работа модуля прекращается вместе с работой его
потоков, этот метод может возвращать self.kernel.finished() - ядро как раз следит за рабочим состоянием потоков и вернёт
в этом методе True как только они остановятся.<br/>
<br/>
По классу очереди. Он должен являться наследником WSJob. Других требований нет.<br />
Класс потока должен быть наследником WSThread и содержать всю логику основной работы - то, что именно будет делать модуль.
Найденные результаты должны помещаться в объект результатов (WSThread.result).
Помните о том, что в конце работы потока (например когда опустеет очередь) он должен своё свойство running установить в значение False,
чтоб ядро знало что он закончил.
<br/>
Что касается класса результата, то он должен быть наследником WSResult. Более никаких требований не предъявляется.
</p>
</body>
</html>
